package mytest

import "fmt"

func IterateString() {
	// 包含中文和英文的字符串
	s := "Hello, Go 语言!"

	fmt.Printf("要遍历的字符串: \"%s\"\n", s)
	fmt.Printf("字符串的字节长度: %d\n\n", len(s))

	// --- 方法一：按字节（byte）遍历 ---
	// 适用于只包含 ASCII 字符或需要处理原始字节数据的情况。
	// 对于多字节字符（如中文），这种方法会把一个字符拆成多个字节，可能导致乱码。
	fmt.Println("--- 方法一：按字节 (byte) 遍历 ---")
	for i := 0; i < len(s); i++ {
		// s[i] 取得的是一个 byte 类型的值
		fmt.Printf("索引 %d: 字节值 %d ('%c')\n", i, s[i], s[i])
	}
	fmt.Println("----------------------------------\n")

	// --- 方法二：按 Unicode 字符（rune）遍历 ---
	// 这是Go语言处理包含非 ASCII 字符（如中文、日文、表情符号等）字符串的**推荐方法**。
	// 它使用 range 循环，能正确地处理 UTF-8 编码的多字节字符，每次迭代得到一个完整的字符（rune）。
	fmt.Println("--- 方法二：按 Unicode 字符 (rune) 遍历 (推荐) ---")
	for index, char := range s {
		// index 是字符在字符串中的起始字节索引
		// char 是一个 rune 类型（即 int32），代表一个 Unicode 码点
		fmt.Printf("起始字节索引 %d: 字符 '%c', Unicode 码点 %U\n", index, char, char)
	}
	fmt.Println("--------------------------------------------------\n")

	// --- 额外方法：将字符串转换为 []rune 再遍历 ---
	// 当你需要进行字符串操作（如反转、修改特定字符）时，这很有用。
	fmt.Println("--- 额外方法：将字符串转换为 []rune 后遍历 ---")
	runes := []rune(s)
	for i := 0; i < len(runes); i++ {
		fmt.Printf("rune 数组索引 %d: 字符 '%c', Unicode 码点 %U\n", i, runes[i], runes[i])
	}
	fmt.Println("--------------------------------------------------")

}
